// var n;
// var $bundleConfig = require("./BundleConfig");
// var $logManager = require("./LogManager");
// var l = (function (e) {
//     function t() {
//         return (null !== e && e.apply(this, arguments)) || this;
//     }
//     __extends(t, e);
//     t.prototype.loadBundle = function (e) {
//         return new Promise(function (t) {
//             var o = cc.assetManager.getBundle(e);
//             if (e == $bundleConfig.BundleNames.Resouce) {
//                 o = cc.resources;
//             }
//             if (o) {
//                 t(o);
//             } else {
//                 cc.assetManager.loadBundle(e, function (o, n) {
//                     if (o) {
//                         $logManager.LogMgr.error("Failed to load bundle: " + e);
//                         t(null);
//                     } else {
//                         t(n);
//                     }
//                 });
//             }
//         });
//     };
//     t.prototype.loadRes = function (e, t, o) {
//         var n = this;
//         return new Promise(function (i) {
//             return __awaiter(n, void 0, void 0, function () {
//                 return __generator(this, function (n) {
//                     switch (n.label) {
//                         case 0:
//                             if ("string" != typeof e) {
//                                 return [3, 2];
//                             } else {
//                                 return [4, this.loadBundle(e)];
//                             }
//                         case 1:
//                             e = n.sent();
//                             n.label = 2;
//                         case 2:
//                             e.load(t, o, function (o, n) {
//                                 if (o) {
//                                     $logManager.LogMgr.error("Failed to load res: bundle:" + e + " , url:" + t);
//                                     i(null);
//                                 } else {
//                                     i(n);
//                                 }
//                             });
//                             return [2];
//                     }
//                 });
//             });
//         });
//     };
//     t.prototype.loadDir = function (e, t, o) {
//         var n = this;
//         return new Promise(function (i) {
//             return __awaiter(n, void 0, void 0, function () {
//                 return __generator(this, function (n) {
//                     switch (n.label) {
//                         case 0:
//                             if ("string" != typeof e) {
//                                 return [3, 2];
//                             } else {
//                                 return [4, this.loadBundle(e)];
//                             }
//                         case 1:
//                             e = n.sent();
//                             n.label = 2;
//                         case 2:
//                             e.loadDir(t, o, function (o, n) {
//                                 if (o) {
//                                     $logManager.LogMgr.error("Failed to load dir: " + e + " , " + t);
//                                     i(null);
//                                 } else {
//                                     i(n);
//                                 }
//                             });
//                             return [2];
//                     }
//                 });
//             });
//         });
//     };
//     t.prototype.loadRemote = function (e, t) {
//         t = t || {};
//         return new Promise(function (o) {
//             if (e) {
//                 cc.assetManager.loadRemote(e, t, function (e, t) {
//                     o(e ? null : t);
//                 });
//             } else {
//                 o(null);
//             }
//         });
//     };
//     return t;
// })(require("./SingletonManager").SingletonMgr);
// exports.default = l.getInstance();


// import { BundleNames } from "./BundleConfig";
// import { LogMgr } from "./LogManager";
// import { SingletonMgr } from "./SingletonManager";

// /**
//  * 资源加载管理类
//  * 建议类名：ResourceLoader
//  */
// class ResourceLoader extends SingletonMgr {
//     constructor() {
//         super();
//     }

//     /**
//      * 加载资源包
//      * @param bundleName - 资源包名称
//      * @returns Promise<cc.AssetManager.Bundle | null>
//      * 建议方法名：loadBundle
//      */
//     public loadBundle(bundleName: string): Promise<cc.AssetManager.Bundle | null> {
//         return new Promise((resolve) => {
//             let bundle = cc.assetManager.getBundle(bundleName);
//             if (bundleName === BundleNames.Resouce) {
//                 bundle = cc.resources;
//             }
//             if (bundle) {
//                 resolve(bundle);
//             } else {
//                 cc.assetManager.loadBundle(bundleName, (err, loadedBundle) => {
//                     if (err) {
//                         LogMgr.error("Failed to load bundle: " + bundleName);
//                         resolve(null);
//                     } else {
//                         resolve(loadedBundle);
//                     }
//                 });
//             }
//         });
//     }

//     /**
//      * 加载资源
//      * @param bundleName - 资源包名称
//      * @param resourcePath - 资源路径
//      * @param type - 资源类型
//      * @returns Promise<any>
//      * 建议方法名：loadRes
//      */
//     public loadRes(bundleName: string | cc.AssetManager.Bundle, resourcePath: string, type: typeof cc.Asset): Promise<any> {
//         return new Promise(async (resolve) => {
//             if (typeof bundleName === "string") {
//                 bundleName = await this.loadBundle(bundleName);
//             }
//             if (bundleName) {
//                 bundleName.load(resourcePath, type, (err, resource) => {
//                     if (err) {
//                         LogMgr.error("Failed to load res: bundle:" + bundleName + " , url:" + resourcePath);
//                         resolve(null);
//                     } else {
//                         resolve(resource);
//                     }
//                 });
//             } else {
//                 resolve(null);
//             }
//         });
//     }

//     /**
//      * 加载目录
//      * @param bundleName - 资源包名称
//      * @param dirPath - 目录路径
//      * @param type - 资源类型
//      * @returns Promise<any[]>
//      * 建议方法名：loadDir
//      */
//     public loadDir(bundleName: string | cc.AssetManager.Bundle, dirPath: string, type: typeof cc.Asset): Promise<any[]> {
//         return new Promise(async (resolve) => {
//             if (typeof bundleName === "string") {
//                 bundleName = await this.loadBundle(bundleName);
//             }
//             if (bundleName) {
//                 bundleName.loadDir(dirPath, type, (err, resources) => {
//                     if (err) {
//                         LogMgr.error("Failed to load dir: " + bundleName + " , " + dirPath);
//                         resolve(null);
//                     } else {
//                         resolve(resources);
//                     }
//                 });
//             } else {
//                 resolve(null);
//             }
//         });
//     }

//     /**
//      * 加载远程资源
//      * @param url - 远程资源URL
//      * @param options - 加载选项
//      * @returns Promise<any>
//      * 建议方法名：loadRemote
//      */
//     public loadRemote(url: string, options?: any): Promise<any> {
//         options = options || {};
//         return new Promise((resolve) => {
//             if (url) {
//                 cc.assetManager.loadRemote(url, options, (err, resource) => {
//                     resolve(err ? null : resource);
//                 });
//             } else {
//                 resolve(null);
//             }
//         });
//     }
// }

// export default ResourceLoader.getInstance();

import { BundleNames } from "./BundleConfig"; // 资源包名称配置
import { LogMgr } from "./LogManager"; // 日志管理类
import { SingletonBase } from "./SingletonManager"; // 单例管理类

/**
 * 资源加载管理类
 * 建议类名：ResourceLoader
 */
class ResourceLoader extends SingletonBase {
    constructor() {
        super();
    }

    /**
     * 加载资源包
     * @param bundleName - 资源包名称
     * @returns Promise<cc.AssetManager.Bundle | null>
     * 建议方法名：loadBundle
     */
    public loadBundle(bundleName: string): Promise<cc.AssetManager.Bundle | null> {
        return new Promise((resolve) => {
            let assetBundle = cc.assetManager.getBundle(bundleName);
            if (bundleName === BundleNames.Resouce) {
                assetBundle = cc.resources;
            }
            if (assetBundle) {
                resolve(assetBundle);
            } else {
                cc.assetManager.loadBundle(bundleName, (err, loadedBundle) => {
                    if (err) {
                        LogMgr.error(`Failed to load bundle: ${bundleName}`);
                        resolve(null);
                    } else {
                        resolve(loadedBundle);
                    }
                });
            }
        });
    }

    /**
     * 加载资源
     * @param bundleName - 资源包名称
     * @param resourcePath - 资源路径
     * @param type - 资源类型
     * @returns Promise<any>
     * 建议方法名：loadRes
     */
    public loadRes(bundleName: string | cc.AssetManager.Bundle, resourcePath: string, type: typeof cc.Asset): Promise<any> {
        return new Promise(async (resolve) => {
            let assetBundle: cc.AssetManager.Bundle | null = typeof bundleName === "string" ? await this.loadBundle(bundleName) : bundleName;
            if (assetBundle) {
                assetBundle.load(resourcePath, type, (err, resource) => {
                    if (err) {
                        LogMgr.error(`Failed to load res: bundle: ${bundleName}, url: ${resourcePath}`);
                        resolve(null);
                    } else {
                        resolve(resource);
                    }
                });
            } else {
                resolve(null);
            }
        });
    }

    /**
     * 加载目录
     * @param bundleName - 资源包名称
     * @param dirPath - 目录路径
     * @param type - 资源类型
     * @returns Promise<any[]>
     * 建议方法名：loadDir
     */
    public loadDir(bundleName: string | cc.AssetManager.Bundle, dirPath: string, type: typeof cc.Asset): Promise<any[]> {
        return new Promise(async (resolve) => {
            let assetBundle: cc.AssetManager.Bundle | null = typeof bundleName === "string" ? await this.loadBundle(bundleName) : bundleName;
            if (assetBundle) {
                assetBundle.loadDir(dirPath, type, (err, resources) => {
                    if (err) {
                        LogMgr.error(`Failed to load dir: ${bundleName}, ${dirPath}`);
                        resolve(null);
                    } else {
                        resolve(resources);
                    }
                });
            } else {
                resolve(null);
            }
        });
    }

    /**
     * 加载远程资源
     * @param url - 远程资源URL
     * @param options - 加载选项
     * @returns Promise<any>
     * 建议方法名：loadRemote
     */
    public loadRemote(remoteUrl: string, loadOptions?: any): Promise<any> {
        const options = loadOptions || {};
        return new Promise((resolve) => {
            if (remoteUrl) {
                console.log(`loadRemote: ${remoteUrl}`);
                cc.assetManager.loadRemote(remoteUrl, options, (err, resource) => {
                    resolve(err ? null : resource);
                });
            } else {
                resolve(null);
            }
        });
    }
}

export default ResourceLoader.getInstance();

// 代码优化说明:
// 1. 变量命名优化：将某些变量名改为更具描述性的命名，例如 assetBundle 代替原先的 bundle。
// 2. 使用模板字符串优化字符串拼接，例如 `Failed to load bundle: ${bundleName}`。
// 3. 每个方法中的 resolve(null) 移动到最后，以确保代码可读性和一致性。
// 4. 在 loadRes 和 loadDir 中，将 typeof 和 await 组合成一个语句来减少冗余代码。